iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

玩程式新手村 – C和Python系列 第 27

第27天 - C 和 Python函式的對抗 (二)

  • 分享至 

  • xImage
  •  

函式的回傳值 (return value)

我們使用函式參數將資料傳入函式。而當函式想要回傳結果時,有兩條途徑:

  • 在函式內改變參數的值來回傳結果。
    如前篇文章說明, 如果 C 函式使用指標 (Pointers) 傳遞參數,或 Python 函式參數使用可變動型態物件,則當函式內對參數進行的任何改變,都會影響函式外的原來變數內容。
    不過,使用這種方式要小心,避免意外錯誤或副作用的產生。

  • 使用關鍵字 return 回傳結果。
    如果回傳的資料量不是很大,通常都會使用這個 return途徑。

  • 在 C 程式碼:

    • 需要在函式的前頭宣告回傳類型 (例如 int),如果沒有回傳值,就要宣告為 void

    • 如果想要回傳多個值,回傳類型可以考慮使用結構 (Struct)。

      這是 C函式的回傳類型範例:

      int retDouble(int x) {  
          int a;
          a = x * 2;
          return a;    // **回傳**類型: int
      }
      
      typedef struct {
          int add;
          int minus;
      } AddAndMinus;
      
      AddAndMinus add_minus_func(int x, int y) {
          AddAndMinus result;
          result.add = x + y;
          result.minus = x - y;
          return result;   // **回傳**類型: 結構 (Struct)
      }
      
      int main() {
          int retVal = retDouble(8);
          printf("回傳值: %d\n", retVal);
      
          AddAndMinus result = add_minus_func(8, 3);
          printf("相加: %d\n", result.add);
          printf("相減: %d\n", result.minus);
      
          return 0;
      }
      
  • 在 Python 程式碼:

    • 不需要指定函式的回傳類型,可以返回任何類型的值,Python解譯器會動態確定類型。
    • 如果函式內沒有使用 return 回傳結果,它會自動回傳 None
    • 可以回傳多個值,回傳類型常是元組 (tuple) 。

    這是 Python 函式的回傳類型範例:

    def ret_double(x):
    	  return x * 2           # 回傳類型和參數x 一樣
    
    def add_minus_func(x, y):
      return x + y, x - y       # 回傳類型是元組 tuple
    
    ret_val = ret_double(8);
    print(f"回傳值: {ret_val }")    # 回傳值: 16
    
    result = add_minus_func(8, 3)   
    print(result)                   # (11, 5)
    print(type(result))             # <class 'tuple'>
    
    ret_add, ret_minus = add_minus_func(8, 3)  # unpack the tuple to variables
    print(f"相加: {ret_add}, 相減: {ret_minus}")  # 相加: 11, 相減: 5
    

Python 函式的進階說明

這裡只是簡單介紹 Python 函式的進階功能,沒有提供完整的語法定義、詳細使用細節與應用。主要是讓我們了解 Python函式和 C函式的差異。

  • 類型提示 (Type Hints):
    前面有提到 Python 不需要指定函式的回傳類型,雖然這樣的設計很自由,但有時候無法讓我們快速判斷某一函式的回傳類型。

    所以從 Python 3.5 開始能夠將程式碼加上類型註釋 (Type Annotation) ,讓程式更容易閱讀。注意,這只是註釋,並沒有限定程式碼使用類型種類。

    def add_typing(num_x: int, num_y: int=10) -> int:
    	sum = num_x + num_y
    	return sum
    
  • 巢狀函式 (Nested Function) :
    在Python 函式內還可以定義函式,叫做 巢狀函式(Nested Function) 也稱為 內部函式(inner function),

    巢狀函式的主要用處:能直接存取外部函式之參數,或者先前宣告之區域變數,如此可減少呼叫函式時引數的傳遞。並且可以建立在呼叫之間的保留狀態 (類似 C 函式內 static , 在下篇文章說明)。

    def outer_func(a, b):
        num = 3
        def inner_func():  # 巢狀函式 或 內部函式
            nonlocal num   # 存取外部函式的區域變數
            num += 2
            print(a, b)   # 可讀取 外部函式的參數
            return num
        return inner_func
    
  • 匿名函式 (Lambda Function)

    • lambda 函式是「只有一行」的函式
    • 不需要定義名稱,使用 lambda 取代 def
    • 執行完成後自動回傳結果,不需要 return
    def add_func(x, y):
        return x+y
    
    b = lambda x, y: x+y  # 匿名函式
    

上一篇
第26天 - C 和 Python函式的對抗 (一)
下一篇
第28天 - C 和 Python的作用範圍(scope)
系列文
玩程式新手村 – C和Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言